package com.china.produce.system.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ESQueryJsonBuilderUtil {
    /**
     * @param _source （源滤波器）指定返回的字段，传null返回所有字段
     * @param query
     * @param from    从第几条数据开始
     * @param size    返回条目数
     * @return { "query": query }
     */
    public static JSONObject buildQuery(List<String> _source, JSONObject query, int from, int size) {
        JSONObject json = new JSONObject();
        if (_source != null) {
            json.put("_source", _source);
        }
        json.put("query", query);
        json.put("from", from);
        json.put("size", size);
        return json;
    }

    /**
     * @param _source （源滤波器）指定返回的字段，传null返回所有字段
     * @param query
     * @param from    从第几条数据开始
     * @param size    返回条目数
     * @param args    其他需要的参数
     * @return { "query": query }
     */
    public static JSONObject buildQuery(List<String> _source, JSONObject query, int from, int size , Map<String,Object> args) {
        JSONObject json = new JSONObject();
        if (_source != null) {
            json.put("_source", _source);
        }
        json.put("query", query);
        json.put("from", from);
        json.put("size", size);

        Set<String> set = args.keySet();
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            String key = it.next();
            Object value = args.get(key);
            json.put(key,value);
        }


        return json;
    }



    /**
     * @param _source （源滤波器）指定返回的字段，传null返回所有字段
     * @param query
     * @param from    从第几条数据开始
     * @param size    返回条目数
     * @param args    其他需要的参数
     * @return { "query": query }
     */
    public static JSONObject buildAggQuery(List<String> _source, JSONObject query, int from, int size , Map<String,Object> args) {
        JSONObject json = new JSONObject();
        if (_source != null) {
            json.put("_source", _source);
        }
        json.put("query", query);
        json.put("from", from);
        json.put("size", size);

        Set<String> set = args.keySet();
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            String key = it.next();
            Object value = args.get(key);
            json.put(key,value);
        }


        return json;
    }

    /**
     * @return { "bool" : { "must": must, "must_not": mustNot, "should": should } }
     */
    public static JSONObject buildBoolQuery(JSONArray must, JSONArray mustNot, JSONArray should) {
        JSONObject bool = new JSONObject();
        if (must != null) {
            bool.put("must", must);
        }
        if (mustNot != null) {
            bool.put("must_not", mustNot);
        }
        if (should != null) {
            bool.put("should", should);
        }
        JSONObject json = new JSONObject();
        json.put("bool", bool);
        return json;
    }

    /**
     * @param field 要查询的字段
     * @param args  查询参数，参考： *哈哈* OR *哒* NOT *呵* OR *啊*
     * @return
     */
    public static JSONObject buildQueryString(String field, String... args) {
        if (field == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder(field).append(":(");
        if (args != null) {
            for (String arg : args) {
                sb.append(arg).append(" ");
            }
        }
        sb.append(")");
        return buildQueryString(sb.toString());
    }

    /**
     * @return { "query_string": { "query": query }  }
     */
    public static JSONObject buildQueryString(String query) {
        JSONObject queryString = new JSONObject();
        queryString.put("query", query);
        JSONObject json = new JSONObject();
        json.put("query_string", queryString);
        return json;
    }

    /**
     *
     * @param query
     * @param default_field
     * @return     {"match": {"fromUrl.keyword": "https://sputniknews.com/russia/"}},
     */
    public static JSONObject buildMatch(String query , String default_field) {
        JSONObject queryString = new JSONObject();
        queryString.put(query, default_field);
        JSONObject json = new JSONObject();
        json.put("match", queryString);
        return json;
    }
    /**
     *
     * @param query
     * @param default_field
     * @return     {"match": {"fromUrl.keyword": "https://sputniknews.com/russia/"}},
     */
    public static JSONObject buildNotMatch(String query , String default_field) {
        JSONObject queryString = new JSONObject();
        queryString.put(query, default_field);
        JSONObject json = new JSONObject();
        json.put("match_phrase", queryString);
        return json;
    }

    /**
     * @return { "ma": { "query": query,"default_field",default_field }  }
     */
    public static JSONObject buildQueryString(String query , String default_field) {
        JSONObject queryString = new JSONObject();
        queryString.put("query", query);
        queryString.put("default_field" , default_field);
        JSONObject json = new JSONObject();
        json.put("query_string", queryString);
        return json;
    }

    /**
     * @param field      查询字段
     * @param min        最小值
     * @param max        最大值
     * @param containMin 范围内是否包含最小值
     * @param containMax 范围内是否包含最大值
     * @return { "range" : { field : { 『 "gt『e』?containMin" : min 』?min!=null , 『 "lt『e』?containMax" : max 』}} }
     */
    public static JSONObject buildRangeQuery(String field, Object min, Object max, boolean containMin, boolean containMax) {
        JSONObject inner = new JSONObject();
        if (min != null) {
            if (containMin) {
                inner.put("gte", min);
            } else {
                inner.put("gt", min);
            }
        }
        if (max != null) {
            if (containMax) {
                inner.put("lte", max);
            } else {
                inner.put("lt", max);
            }
        }
        JSONObject range = new JSONObject();
        range.put(field, inner);
        JSONObject json = new JSONObject();
        json.put("range", range);
        return json;
    }

    /**
     * @param field      查询字段
     * @param min        最小值
     * @param max        最大值
     * @param containMin 范围内是否包含最小值
     * @param containMax 范围内是否包含最大值
     * @return { "range" : { field : {  "format" : format ,『 "gt『e』?containMin" : min 』?min!=null , 『 "lt『e』?containMax" : max 』}} }
     */
    public static JSONObject buildRangeQuery(String field, Object min, Object max, boolean containMin, boolean containMax , Object format) {
        JSONObject inner = new JSONObject();
        if (min != null) {
            if (containMin) {
                inner.put("gte", min);
            } else {
                inner.put("gt", min);
            }
        }
        if (max != null) {
            if (containMax) {
                inner.put("lte", max);
            } else {
                inner.put("lt", max);
            }
        }

        if(format != null){
            inner.put("format",format);
        }
        JSONObject range = new JSONObject();
        range.put(field, inner);
        JSONObject json = new JSONObject();
        json.put("range", range);
        return json;
    }

}
